package domain

import (
	"bytes"
	"strconv"
	"time"

	//ASE "designMode/lession14/algorithm"
	ASE "designMode/lession14/algorithm"
	"errors"
)

// 鉴权 要想两边的功能 一个结构体可以包括两边功能 分割成一个完整的

// token相关操作
/**
	功能：
		1. 把URL AppID 密码 时间戳拼接为一个字符串
		2. 对字符串通过加密算法加密 生成token
		3. 根据时间戳判断token是否过期失效（比如1分钟是有效期）
		4. 验证两个token是否匹配
 */
var DEFAULT_EXPIRED_TIME_INTERVAL int64 = 1*60  // 默认过期时间1分钟 60秒
type AuthToken struct {
	token []byte	// 生成的token
	createTime int64   // 时间戳
	expiredTimeInterval int64
}

// 构造函数
func NewAuthToken(token []byte,createTime int64,expiredTimeInterval int64)(*AuthToken){
	if expiredTimeInterval <= 0{
		expiredTimeInterval = DEFAULT_EXPIRED_TIME_INTERVAL
	}
	return &AuthToken{
		token: token,
		createTime: createTime,
		expiredTimeInterval: expiredTimeInterval,
	}
}


// 函数

// 生成token params 参数 有appID 密码等 在客户端可以用 在服务端也可以用
func Create(baseUrl string,creatTime int64,params map[string]string)*AuthToken{
	// 从参数中解析出密码和appId
	password:=params["password"]
	appId:=params["appId"]
	str:=baseUrl+"/"+appId+"/"+password+"/"+strconv.FormatInt(creatTime,10)

	// 使用加密算法 加密字符串 生成token
	AesKey := []byte("0f90023fc9ae101e") //秘钥长度为16的倍数
	token,err := ASE.AesEncrypt([]byte(str),AesKey)
	if err!=nil{
		errors.New("ASE加密失败")
	}

	return &AuthToken{
		token: token,
		createTime: creatTime,
		expiredTimeInterval: DEFAULT_EXPIRED_TIME_INTERVAL,
	}
}

// 获取token
func (this *AuthToken)GetToken()[]byte{
	return this.token
}

// token是否过期
func (this *AuthToken)IsExpired()bool{
	now := time.Now().Unix()
	interval := now - this.createTime
	// 没有过期
	if interval < this.expiredTimeInterval{
		return false
	}
	// 过期了
	return true
}

// 传过来的token与生成的token是否匹配
func (this *AuthToken)Match(authToken *AuthToken)bool{
	equal := bytes.Equal(this.token, authToken.token)
	return equal
}


